#include <vector>
#include <list>
#include <string>

#ifndef VAR
	#define VAR(i,v) __typeof((v))i=(v)
	#define FOREACH(i,v) for(VAR(i,(v).begin());i!=(v).end();i++)
#endif

int mgreedy(std::vector<std::string> input, int **graph, int max, int draw_if);

/**
 * TRUE - element trzeba wstawic przed a_pos
 * FALSE - elements wstawić po a_pos
 * b_pos < 0 - nie znaleziono elementu
 */
bool findBestElement(int a_pos, int** graph, bool *used, int *next, int &b_pos, int len, int *lengths, int max);


/**
 * Próbuje dołączyc do najlepszej sekwencji oligonukleotydy z pozostałych powstałych sekwencji
 *
 * @param best numer początkowego oligonukleotydu najlepszej sekwencji
 * @param others lista początków sekwencji - poza największą
 * @param used oznaczenie posiadania poprzednika
 * @param next lista następnikow
 * @param lengths długości podsekwencji
 * @param graph graf odległości oligonukleotydów
 * @param max maksymalna długość sekwencji wyjściowej
 * @return Dlugość powstałej w ten sposób sekwencji
 */
int tryToMerge(int best, std::list<int> others, bool *used, int *next, int *lengths, int **graph, int max);


std::list<int> findBestAfter(int a_pos, int *next, bool *used, int **graph, int *lengths, int len, int max, int &aft);


void displayBestSeq(int **graph);
void clearBest();
